﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Xml.Linq;
using Atendex.Dominio.Interfaces;
using Atendex.Infraestrutura.Repositórios;
using Atendex.Dominio;
using Atendex.Containex;
using Atendex.Web.AppCode;

namespace Atendex.Web
{
    public partial class EditarCurso : System.Web.UI.Page
    {
        private readonly RepositorioCurso repCurso = new RepositorioCurso();

        private bool Editando
        {
            get
            {
                bool? editando = (bool?)ViewState["editando"];
                if (editando == null || editando == false)
                    return false;
                return true;
            }
            set
            {
                ViewState["editando"] = value;
                if (value)
                {
                    lblLegend.Text = "Editar Curso";
                    btnLimpar.Text = "Cancelar";
                    btnExcluir.Visible = true;
                }
                else
                {
                    lblLegend.Text = "Novo Curso";
                    btnLimpar.Text = "Limpar";
                    btnExcluir.Visible = false;
                }
            }
        }

        private ICurso ObjetoEditado
        {
            get
            {
                return (ICurso)ViewState["objeto_editado"];
            }
            set
            {
                ViewState["objeto_editado"] = value;
            }
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            AtualizaGrid();
        }

        private void AtualizaGrid()
        {
            ICurso[] cursos = repCurso.ObtemTodos();
            gridAreas.DataSource = cursos;
            gridAreas.DataBind();
            ViewState["objetos"] = cursos;
        }

        private void CarregarObjeto(ICurso curso)
        {
            txtNomeCurso.Text = curso.Nome;
            txtNomeResponsavel.Text = curso.Responsaveis[0].Nome;
            txtEmailResponsavel.Text = curso.Responsaveis[0].Email;
            this.ObjetoEditado = curso;
            this.Editando = true;
        }

        protected void gridAreas_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            // commandargument parece vir sempre com o índice da linha que teve
            // o botão apertado
            int i = int.Parse((string)e.CommandArgument);
            ICurso area = ((ICurso[])ViewState["objetos"])[i];
            CarregarObjeto(area);
        }

        protected void btnLimpar_Click(object sender, EventArgs e)
        {
            LimparCampos();
            this.Editando = false;
        }

        protected void btnSalvar_Click(object sender, EventArgs e)
        {
            if (!this.Editando)
                SalvarNovoObjeto();
            else
                AtualizarObjeto();

            AtualizaGrid();
        }

        private void AtualizarObjeto()
        {
            ICurso curso = this.ObjetoEditado;
            curso.Nome = txtNomeCurso.Text;
            curso.Responsaveis[0].Nome = txtNomeResponsavel.Text;
            curso.Responsaveis[0].Email = txtEmailResponsavel.Text;

            try
            {
                repCurso.Salvar(curso);
                ShowMensagem("O curso foi atualizado.");
                LimparCampos();
                this.Editando = false;
            }
            catch (RepositorioException ex)
            {
                ShowMensagem("Houve um erro ao atualizar o curso: " + ex.Message);
            }
        }

        private void SalvarNovoObjeto()
        {
            try
            {
                List<IResponsavel> lstResponsavel = new List<IResponsavel>();
                IResponsavel responsavel = Container.CriarResponsavel(txtNomeResponsavel.Text, txtEmailResponsavel.Text);
                lstResponsavel.Add(responsavel);

                ICurso curso = Container.CriarCurso(txtNomeCurso.Text, lstResponsavel);

                repCurso.Salvar(curso);
                ShowMensagem("Curso cadastrado com sucesso.");
                LimparCampos();
            }
            catch (RepositorioException ex)
            {
                ShowMensagem("Houve um erro ao salvar: " + ex.Message);
            }
        }

        private void LimparCampos()
        {
            txtNomeCurso.Text = "";
            txtNomeResponsavel.Text = "";
            txtEmailResponsavel.Text = "";
        }

        private void ShowMensagem(string mensagem)
        {
            lblMensagem.Text = mensagem;
            lblMensagem.Visible = true;
        }

        protected void btnExcluir_Click(object sender, EventArgs e)
        {
            try
            {
                ICurso curso = ObjetoEditado;
                curso.Ativa = false;
                repCurso.Salvar(curso);
                ShowMensagem("O curso foi excluído.");
                LimparCampos();
                this.Editando = false;
                AtualizaGrid();
            }
            catch (RepositorioException ex)
            {
                ShowMensagem("Houve um erro ao excluir: " + ex.Message);
            }
        }

        protected void gridAreas_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                ICurso curso = (ICurso)e.Row.DataItem;
                if (curso.Responsaveis.Count > 0)
                {
                    e.Row.Cells[2].Text = curso.Responsaveis[0].Nome;
                    e.Row.Cells[3].Text = curso.Responsaveis[0].Email;
                }
            }
        }
    }
}

